perm filename ERROR[MAC,LSP] blob sn#400770 filedate 1978-12-12 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00030 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	   -*-MIDAS-*-
C00005 00003
C00009 00004
C00012 00005
C00015 00006
C00024 00007
C00026 00008
C00030 00009
C00032 00010
C00035 00011
C00037 00012
C00039 00013
C00041 00014
C00044 00015
C00046 00016
C00050 00017
C00052 00018
C00054 00019
C00056 00020
C00058 00021
C00060 00022
C00063 00023
C00065 00024
C00070 00025
C00072 00026
C00075 00027
C00078 00028
C00080 00029
C00083 00030
C00085 ENDMK
C⊗;
;;;   -*-MIDAS-*-
;;;   **************************************************************
;;;   ***** MACLISP ****** MACLISP ERROR HANDLERS, AND MSGS ********
;;;   **************************************************************
;;;   ** (C) COPYRIGHT 1978 MASSACHUSETTS INSTITUTE OF TECHNOLOGY **
;;;   ****** THIS IS A READ-ONLY FILE! (ALL WRITES RESERVED) *******
;;;   **************************************************************

SUBTTL	ERROR UUO HANDLERS

.SEE EPRINT
EPRNT1:
IFE QIO,[
	PUSHJ P,SAVX3		;ERROR PRINT
	PUSHJ P,TLPRINT
	JRST RSTX3
]		;END OF IFE QIO
IFN QIO,[
	PUSHJ P,SAVX5		;ERROR PRIN1
	PUSH P,AR1	.SEE ERROR3
	PUSHJ P,MSGFCK
	SKIPN V%PR1
	 JRST EPRNT2
	MOVEI B,(AR1)
	CALLF 2,@V%PR1
	JRST EPRNT3

EPRNT2:	TLO AR1,200000
	PUSHJ P,$PRIN1
EPRNT3:	STRT 17,[SIXBIT \ !\]
	POP P,AR1
	JRST RSTX5
]		;END OF IFN QIO


ERROR1:	MOVEM TT,UUTTSV
	MOVEM R,UURSV
EROR1Z:	JSP TT,ERROR9		;PROCESS A LISP ERROR
	 JRST EROR1A		; (LERR AND LER3)
Q%	SKIPE VJPG	;***** CROCK!!!!! FOR JPG *****
Q%	 JRST EROR1Q
Q%	SKIPE VERRSET
Q%	 SKIPN ERRTN
Q% EROR1Q:	SETZM TTYOFF
Q%	JSR ERROR3
Q$	PUSHJ P,MSGFCK
Q$	MOVEI D,-2(P)		;D POINTS TO ERRFRAME
Q$	PUSHJ P,ERROR3
EROR1A:	MOVEI A,NIL
	JRST 2,@[ERRRTN]

IFN QIO,[
;;; MSGFILES CHECK.  GET VALUE OF MSGFILES IN AR1 AFTER CHECKING FOR
;;; VALIDITY.  IF A LOSER, SIGNAL AN ERROR AFTER RESTORING IT TO (T).
;;; SAVES A.

MSGFCK:	HRRZ AR1,VMSGFILES
SFA$	JSP F,MSGFC1		;MAKE SURE AN SFA NEVER GETS INVOKED FROM
SFA$	0			; MPFLOK, BUT STILL DO VALIDITY CHECK
SFA$ MSGFC1:
	PUSHJ P,MPFLOK		;SKIPS IF LIST OF FILES *NOT* VALID
CMSGFCK: POPJ P,MSGFCK
	PUSH P,A
	MOVEI A,(AR1)
	PUSHJ P,NCONS
	MOVEI B,QMSGFILES
	PUSHJ P,XCONS
	MOVEI AR1,QTLIST
	MOVEM AR1,VMSGFILES
	PUSHJ P,[IOL [BAD VALUE FOR MSGFILES!]]
	POP P,A
	JRST MSGFCK
]		;END OF IFN QIO

SUBTTL	ERRFRAME FORMATS

;;; FORMAT OF ERRFRAME:
;;;
;;; [1] NORMAL TYPE ERROR (ERINT, LERR, ETC.)
;;;		<SP>,,<RETURN FROM ERROR IF ERINT>
;;;		$ERRFRAME
;;;		<UUO>		;ADDRESS OF MSG IN RIGHT HALF
;;;		<S-EXP>		;FOR ERINT, LER3
;;;
;;; [2] ERRBAD TYPE ERROR (ILL MEM REF, ETC.)
;;;		<SP>,,<ADDRESS WHERE ERROR OCCURRED>
;;;		$ERRFRAME
;;;		0,,<ADDRESS OF MSG>
.SEE ERRBAD

ERROR9:	PUSH P,UUOH
	HRLM SP,(P)
	PUSH P,[$ERRFRAME]	;RANDOMNUMBER,,EPOPJ
	PUSH P,40		;CANNOT HAVE LH = 0; SEE ERRPRINT
	PUSH P,A
LERFRAME==:4			;LENGTH OF ERRFRAME - WATCH THIS IN CASE OF CHANGE
Q%	PION			; - SHOULD BE LESS THAN 20 (FOR R70 REFS - SEE ERRV)
IFN QIO,[
IFN ITS,[
	.SUSET [.SPICLR,,XC-1]
	.SUSET [.SDF1,,R70]
	.SUSET [.SDF2,,R70]
]		;END OF IFN ITS
IFN D10+D20, PUSHJ P,REAINT	;RE-ENABLE INTERRUPTS
]		;END OF IFN QIO
EROR9A:	SKIPN PSYMF
	 SKIPE ERRSW
	  JRST 1(TT)
	JRST (TT)

;;; ERROR RETURN.  COME HERE TO PERFORM AN ERROR BREAKOUT (RETURN
;;; TO ERRSET OR TOP LEVEL).  VALUE TO RETURN FROM ERRSET IN A.

ERRRTN:	SETZM NOQUIT
Q%	PION			;ERROR PROCESSING RETURNS HERE TO RECOUP BACK
IFN QIO,[
IFN ITS,[
	.SUSET [.SPICLR,,XC-1]
	.SUSET [.SDF1,,R70]
	.SUSET [.SDF2,,R70]
]		;END OF IFN ITS
IFN D10+D20, PUSHJ P,REAINT	;RE-ENABLE INTERRUPTS
]		;END OF IFN QIO
	PUSH P,A
Q$	SKIPL A,UNREAL
	PUSHJ P,CHECKU		;CHECK FOR ANY DELAYED "REAL TIME" INTS
	POP P,A
ERR2:	SKIPE ERRTN		;TO TOPLEVEL, OR BREAK OUT OF AN ERRSET
	JRST ERR0		;GO BREAK UP AN ERRSET
LSPRT0:	PUSH FXP,CATRTN		;RETURN TO TOP LEVEL FROM LISP ERROR
	JSP A,ERINI0
	POP FXP,CATRTN		;GJS NEEDS TO THROW FROM A *RSET-TRAP
CLSPRET:
	SETZ A,LSPRET
	SKIPE B,V.TRAP		;INVOKE *RSET-TRAP
	 CALLF 1,(B)
	MOVE A,VERRLIST
	MOVEM A,VIQUOTIENT
	JUMPE A,LSPRET
	HRRZ T,C2
	HRRZ T,1(T)
	CAIE T,HACENT		;MEANS BUG ON ERRLIST
	 JRST LSPRET
	MOVE A,VERRLIST
	PUSHJ P,NCONS
	MOVEI B,QERRLIST
	PUSHJ P,XCONS
	PUSH P,CLSPRET
	FAC [POSSIBLY FELONIOUS ERRLIST - PLEASE INSPECT BEFORE PROCEEDING!]


SUBTTL	ERINT, SERING, LERR, LER3

;ERROR3:	0	;PRINT OUT ERROR MESSAGE FOR ORDINARY
			; LISP ERRORS (LERR, LER3, ERINT, SERINT)
Q% EROR3A:
Q$ ERROR3:		;FOR QIO, CALLED VIA  PUSHJ P,ERROR3
			;POINTER TO $ERRFRAME IN D
Q$	MOVEI A,TRUTH		;PREVENT AUTO-TERPRI IN THE
Q$	JSP T,SPECBIND		; MIDDLE OF AN ERROR MESSAGE
Q$	   0 A,V%TERPRI		;SPECBIND SAVES D
Q$	HRLI AR1,200000	;OUTPUT FILES LIST FOR MSG IN AR1
Q%	LDB TT,[331100,,-1(P)]	;P HAS BEEN STACKED UP BY ERROR9
Q$	LDB TT,[331100,,1(D)]	;P HAS BEEN STACKED UP BY ERROR9
	JUMPE TT,EROR3C		;ERRBD2 PUSHS MSG WITH NO LERR OPERATION
Q$	HRRZ A,2(D)		;MUST FETCH THE S-EXPRESSION TO PRINT
Q$	STRT AR1,[SIXBIT \↑M;!\]	;PRECEDE MSG WITH A ";"
	CAIE TT,LERR←-33	;LERR DOESN'T PRINT AN S-EXP
	 PUSHJ P,EPRINT
	CAIN TT,SERINT←-33	;SERINT HAS AN S-EXP MSG
	 JRST EROR3F
Q%	LDB A,[270400,,-1(P)]	;IF IT IS LERR OR LER3, THEN
Q$	LDB A,[270400,,1(D)]	;IF IT IS LERR OR LER3, THEN
	CAIE TT,ERINT←-33	; A NON-ZERO AC FIELD MEANS
	 JUMPN A,EROR3F		; THE MSG IS AN S-EXP
EROR3C:
Q%	STRT @-1(P)		;NOTE THAT THIS CLOBBERS ALL UUOH LEVEL VARS
Q$	STRT AR1,@1(D)		;NOTE: THIS CLOBBERS UUOH LEVEL VARS
EROR3E:	STRT AR1,STRTCR
Q%	JRST 2,@ERROR3
Q$	JRST UNBIND

EROR3F:
Q%	HRRZ A,-1(P)		;SERINT IS ERINT WITH S-EXPRESSION MSG
Q%	PUSHJ P,PRINC
Q$	HRRZ A,1(D)
Q$	PUSHJ P,$PRINC
	JRST EROR3E

IFE QIO,[
;ERROR4:	0		;PRINT ERROR MESAGE FOR ERRBAD TYPE ERRORS
EROR4A:	STRT [SIXBIT \↑M;!\]	;SAVES T, FORTUNATELY
	HRRZ TT,-1(T)
	STRT @1(T)		;MAIN PART OF ERR MSG PRINTED HERE
	STRT [SIXBIT \ FROM LOCATION !\]
	PUSH FXP,TT
	MOVEI R,TYO
	PUSHJ P,PRINL4		;LOSING PC PRINTED HERE
	POP FXP,B
	STRT [SIXBIT \↑M;PROGRAM TRAPPED WHILE IN !\]
	PUSHJ P,ERRADR		;PRINT NAME OF LOSING FUNCTION HERE
	PUSHJ P,ITERPRI
	JRST 2,@ERROR4
]		;END OF IFE QIO

;;; PROCESS ERINT/SERINT CORRECTABLE INTERRUPTS

ERROR5:	MOVEM TT,UUTTSV
	MOVEM R,UURSV
	SKIPN ERRTN		;ALLOW USER INTERRUPT TO RUN,
	 JRST EROR5F		; EVEN IF INSIDE AN ERRSET,
	SKIPN VERRSET		; IF THE ERRSET BREAK IS SET
	 JRST ERROR1		;OTHERWISE, JUST DO NORMAL ERROR
EROR5F:	LDB TT,[270400,,40]
	CAIGE TT,NERINT		;TT HAS AC FIELD FROM UUO
	 SKIPN VUDF(TT)
	  JRST ERROR1		;CONVERT TO LER3 IF NOT ENABLED
	MOVEI T,ERRV		;NORMAL XIT FROM CODE BELOW IS POP2J,
Q$	CAIE TT,<%IOL←-27>&17	;IO-LOSSAGE
	 CAIN TT,<%FAC←-27>&17	;FAIL-ACT
	  MOVEI T,EVAL.A
EROR5A:	PUSH FXP,T
	MOVEI T,(TT)	;SAVE AC NUMBER FOR BELOW
	JSP TT,ERROR9	;PUSH AN ERROR FRAME
	 JFCL
	MOVEI A,(A)
	PUSH FXP,T
	JSP T,PDLNMK
Q%	POP FXP,T
Q%	CAIG T,<%UGT←-27>&17	;LISTIFY ONLY FOR UDF, UBV, WTA, AND UGT
Q$	EXCH D,(FXP)
Q$	CAIG D,<%UGT←-27>&17
	 PUSHJ P,ACONS
	PUSH P,A		;FOR GC PROTECTION ONLY
Q%	MOVSI A,(A)
Q%	HRRI A,ERSTBK+1(T)
Q$	TRO D,2000		;ERINT SERIES USER INTERRUPT
Q$	HRLI D,(A)
	MOVE TT,UUTTSV
	MOVE T,UUTSV
	SKIPN INHIBIT
	 SKIPE NOQUIT
	  .VALUE		;STUPID TO SIGNAL ERROR WHEN INTERRUPTS LOCKED
	PUSHJ P,UINT
Q$	POP FXP,D
	SUB P,R70+1		;GC PROTECTION NO LONGER NEEDED
	JUMPE A,EROR6A
	PUSH FXP,TT
	SKOTT A,LS
	 JRST EROR6A
	POP FXP,TT
	HLRZ A,(A)		;IF ATOM RETURNED, THEN CRAP OUT
				;OTHERWISE, RETURNED VALUE IS LIST OF
	 POPJ FXP,		;CORRECT QUANTITY MUST GO TO EVAL.A OR ERRV
EROR6A:	MOVE A,(P)		;RESTORE A
	MOVEI TT,EROR1Z		;USER DIDN'T SUPPLY SUITABLE VALUE
	JRST EROR9A		;SO ERROR OUT

ERRV:	SUB P,R70+LERFRAME-1	;CLEAR OUT ALL BUT RETURN ADDRESS
	POPJ P,

IFN QIO,[

;;; IOJRST UUO DECODER. USAGE:
;;;		.CALL FOO	;OR .OPEN, OR WHATEVER
;;;		 IOJRST N,FOO
;;; IOJRST CAUSES A TRANSFER TO FOO AFTER PUTTING IN C THE
;;; ADDRESS OF A SIXBIT (STRT FORMAT) STRING INDICATING THE
;;; ERROR MESSAGE.  THIS MESSAGE MAY BE GIVEN TO AN ERINT
;;; UUO (TYPICALLY %IOL).  N IS THE NUMBER OF THINGS ON THE
;;; REGPDL ABOVE THE RETURN ADDRESS - THIS IS A CROCK SO THAT
;;; IOJRST CAN STICK THE ADDRESS OF A RESTORATION ROUTINE
;;; ON THE PDL.  (THIS ISN'T DONE IN THE D10 VERSION, HOWEVER.)
;;; FOR ITS, THE MOST RECENT ERROR AS DETERMINED BY .BCHN IS
;;; OBTAINED VIA THE ERR DEVICE AND STACKED UP ON FLP.
;;; FOR D10, TT IS ASSUMED TO CONTAIN THE LOOKUP/ENTER/RENAME
;;; ERROR CODE OF INTEREST, AND IS USED TO INDEX A TABLE.
;;; FOR D20, THE MOST RECENT ERROR IS OBTAINED FROM THE ERSTR
;;; JSYS AND STACKED UP ON FLP.
;;; CLOBBERS THE JCL BUFFER!
;;; USER INTERRUPTS SHOULD BE INHIBITED.

ERRIOJ:
10%	PUSH P,A		;SAVE ACS
10%	PUSH P,B
IFN D10,[
	HRRE C,TT		;ISOLATE ERROR CODE
	SKIPL C			;IF TT CONTAINS SOME WEIRD
	 CAILE TT,LERTBL	; VALUE, JUST CALL IT THE
	  SKIPA C,ERTBL-1	; "UNKNOWN ERROR"
	   MOVE C,ERTBL(C)	;OTHERWISE USE A STANDARD MESSAGE FROM THE TABLE
]		;END OF IFN D10
IFN ITS+D20,[
	PUSHN P,2		;PUSH 2 SPARE PDL SLOTS
	LDB A,[270400,,40]	;GET N
	ADDI A,2		;ADD 2 FOR PUSHED ACS
	MOVEI C,(P)
ERIOJ1:	MOVE B,-2(C)		;SHUFFLE PDL UP TWO SLOTS
	MOVEM B,(C)
	SUBI C,1
	SOJG A,ERIOJ1
	MOVEM FLP,-1(C)		;SAVE CURRENT FLP POINTER
	MOVEI A,ERIOJ9		;PLOP IN ADDRESS OF RESTORATION ROUTINE
	MOVEM A,(C)
	MOVEI C,1(FLP)
	PUSH FXP,C
IFN ITS,[
	.SUSET [.RBCHN,,A]
	.CALL ERIO6B
	 .LOSE 1400
	.CALL ERIOJ6		;GET MOST RECENT ERROR FOR THIS JOB
	 .LOSE 1400
	MOVE A,[440700,,JCLBF]
	MOVEI B,LJCLBF*BYTSWD-1
	.CALL ERIO6A		;READ IT IN USING A SIOT
	 .LOSE 1400
	.CLOSE TMPC,
]		;END OF IFN ITS
IFN D20,[
	HRROI 1,JCLBF
	HRLOI 2,.FHSLF		;GET MOST RECENT ERROR FOR THIS FORK
	HRLZI 3,-<LJCLBF*BYTSWD-1>
	ERSTR
	 HALT			;GROSS ERROR
	 JFCL			;BUFFER NOT BIG ENOUGH
]		;END OF IFN D20
	IDPB NIL,A
	MOVEI A,'#		;# IS THE STRT QUOTE CHARACTER
	PUSH FXP,[440700,,JCLBF]
ERIOJ2:	MOVSI B,(440600,,(FLP))
	PUSH FLP,R70
ERIOJ3:	ILDB C,(FXP)		;GET A CHARACTER OF THE ERROR MESSAGE
	CAIGE C,40
	 JRST ERIOJ8		;ANY CONTROL CHARACTER TERMINATES IT
	CAIGE C,140		;CONVERT CHARACTER TO SIXBIT,
	 SUBI C,40		; ALLOWING LOWER CASE TO WORK
	ANDI C,77
	CAIE C,'#		;SOME CHARACTERS REQUIRE QUOTING
	 CAIN C,'↑
	  JRST ERIOJ5
	CAIN C,'!
	 JRST ERIOJ5
ERIOJ4:	IDPB C,B		;DEPOSIT SIXBIT ON FLP
	TLNE B,770000
	 JRST ERIOJ3
	JRST ERIOJ2		;NO MORE ROOM - MUST PUSH ANOTHER WORD

ERIOJ5:	IDPB A,B		;DEPOSIT QUOTING CHARACTER
	TLNE B,770000
	 JRST ERIOJ4		;GO DEPOSIT REAL CHARACTER
	MOVSI B,(440600,,(FLP))
	PUSH FLP,R70		;NEED ANOTHER WORD FIRST
	JRST ERIOJ4

ERIOJ8:	POPI FXP,1		;FLUSH THE BYTE POINTER ON FXP
	POP FXP,C
ERIOJ7:	MOVEI A,'!		;MUST WRITE TERMINANTION INTO STRING
	IDPB A,B
	POP P,B			;RESTORE A AND B
	POP P,A
]		;END OF IFN ITS+D20
	MOVE T,UUTSV
	JRST @40		;THAT'S 40, NOT UUOH!  MUST EFFECT A TRANSFER

IFN ITS,[
ERIO6B:	SETZ
	SIXBIT/STATUS/
	A			;BAD CHANNEL
	402000,,A		;STATUS RETURNED

ERIOJ6:	SETZ
	SIXBIT \OPEN\		;OPEN FILE
	   1000,,TMPC		;CHANNEL NUMBER
	      ,,[SIXBIT \ERR\]	;DEVICE NAME
	1000,,3			;3 MEANS ERROR STATUS IN FN2
	400000,,A

ERIO6A:	SETZ
	SIXBIT \SIOT\		;STRING I/O TRANSFER
	  1000,,TMPC		;CHANNEL NUMBER
	      ,,A		;BYTE POINTER
	400000,,B		;BYTE COUNT
]		;END OF IFN ITS

IFN ITS+D20,[
;;; RESTORATION ROUTINE

ERIOJ9:	POP P,FLP		;RESTORE FLP
	POPJ P,			;NOW REALLY RETRN FROM ORIGINAL FUNCTION
]		;END OF IFN ITS+D20

IFN D10,[
;;; TABLE OF STANDARD LOOKUP/ENTER/RENAME ERRORS

	[SIXBIT \UNKNOWN ERROR!\]
ERTBL:
OFFSET -.
ERFNF%::	[SIXBIT \FILE NOT FOUND!\]
ERIPP%::	[SIXBIT \NON-EXISTENT PPN!\]
ERPRT%::	[SIXBIT \PROTECTION VIOLATION!\]
ERFBM%::	[SIXBIT \FILE BUSY BEING MODIFIED!\]
ERAEF%::	[SIXBIT \FILE ALREADY EXISTS!\]
ERISU%::	[SIXBIT \ILLEGAL SEQUENCE OF UUOS!\]
ERTRN%::
	SA%	[SIXBIT \TRANSMISSION ERROR!\]
	SA$	[SIXBIT \DIFFERENT FILENAME SPECIFIED!\]
ERNSF%::
	SA%	[SIXBIT \NOT A SAVE FILE!\]
	SA$	[SIXBIT \THIS ERROR CAN'T HAPPEN!\]
ERNEC%::
	SA%	[SIXBIT \NOT ENOUGH CORE!\]
	SA$	[SIXBIT \BAD RETRIEVAL ##10!\]
ERDNA%::
	SA%	[SIXBIT \DEVICE NOT AVAILABLE!\]
	SA$	[SIXBIT \BAD RETRIEVAL ##11!\]
ERNSD%::
	SA%	[SIXBIT \NO SUCH DEVICE!\]
	SA$	[SIXBIT \DISK IS FULL!\]
IFE SAIL,[
ERILU%::	[SIXBIT \ILLEGAL UUO!\]
ERNRM%::	[SIXBIT \NO ROOM ON FILE STRUCTURE!\]
ERWLK%::	[SIXBIT \DEVICE WRITE-LOCKED!\]
ERNET%::	[SIXBIT \NOT ENOUGH MONITOR TABLE SPACE!\]
ERPOA%::	[SIXBIT \PARTIAL ALLOCATION ONLY!\]
ERBNF%::	[SIXBIT \BLOCK NOT FREE!\]
ERCSD%::	[SIXBIT \CAN'T SUPERSEDE DIRECTORY!\]
ERDNE%::	[SIXBIT \CAN'T DELETE NON-EMPTY DIRECTORY!\]
ERSNF%::	[SIXBIT \SFD NOT FOUND!\]
ERSLE%::	[SIXBIT \SEARCH LIST EMPTY!\]
ERLVL%::	[SIXBIT \SFD NESTED TOO DEEP!\]
ERNCE%::	[SIXBIT \NO-CREATE FOR ALL SEARCH LISTS!\]
ERSNS%::	[SIXBIT \NON-SWAPPED SEGMENT!\]
ERFCU%::	[SIXBIT \CAN'T UPDATE FILE!\]
ERLOH%::	[SIXBIT \SEGMENTS OVERLAP!\]
ERNLI%::	[SIXBIT \NOT LOGGED IN!\]
]		;END OF IFE SAIL
LERTBL==:.
OFFSET 0
]		;END OF IFN D10

]		;END OF IFN QIO

SUBTTL	HAIRY PDL OVERFLOW HANDLER FOR DEC-10 (OLDIO)

IFN D10&<QIO-1>,[

PDLOV:	HLRZ A,NOQUIT
	JUMPN A,GCPDLOV		;PDL OV IN GC - LOSE, LOSE, LOSE!!!
	MOVE A,.JBTPC"
	MOVEM A,IPCLOK
PDLOV1:	JUMPGE P,RPOV
	JUMPGE SP,SPOV
	JSR INTWAIT
	 JFCL
	JUMPGE FLP,[LERR POVFLP]
	JUMPL FXP,[LERR [SIXBIT \USER PDL OVERFLOW!\]]
XPOV:	HRRZ A,OFXC2		;CHECK TO SEE IF ALREADY OPERATION IN OVERFLO AREA
	CAIGE A,(FXP)
	 JRST XPOV1
	ADD FXP,[-LOFXPDL,,0]	;SO INCREASE PDL LENGTH BY OVERFLO ALLOTMENT
	LERR POVFXP		;ORDINARY ERROR - TRAPPABLE

XPOV1:	MOVEI B,POVFXP
	JRST PDLOV5		;MUST TAKE A LITTLE DRASTIC ACTION

SPOV:	SUB SP,R70+1
	HRRZ A,OSC2		;UNDO THE CURRENT BATCH OF BINDINGS
	SUBI A,(SP)
	HRRZ TT,SPSV		;THAT CAUSED THE OVERFLO
	PUSHJ P,UBD
	JUMPL A,SPOV1
	ADD SP,[-LOSPDL,,0]
	LERR POVSPDL

SPOV1:	SKIPN ERRTN		;IF NOT ERRSET, THE UNDO BACK TO TOP LEVEL
	 PUSHJ FXP,ERRPOP	;SO THAT *RSET-TRAP CAUSES NO OVERFLO
	MOVEI B,POVSPDL
	JRST PDLOV5

RPOV:	HRRZ A,OC2
	CAIGE A,(P)
	 JRST RPOV7
	ADD P,[-LOPDL+2,,0]	;2 EXTRA, FOR CASES WHERE WE NEED P
	LERR POVPDL		; UNDER PIOF, E.G. SPOV

RPOV7:	MOVE P,OC2
	MOVEI B,POVPDL		;FALL THROUGH TO PDLOV5!!!
]		;END OF IFN D10&<QIO-1>

	SUBTTL DEC-10 HAIRY PDL OVERFLOW HANDLER (NEWIO)

IFN D10&QIO,[
PDLOV:	MOVE F,INTPDL		;INTERRUPT ROUTINES MUST LOAD INTPDL INTO F
	MOVE R,IPSWD1(F)	;GET OLD INTERRUPT MASK
IFE SAIL,[
	TRZ R,AP.CLK		;LEAVE ON ALL EXCEPT CLOCK INTS
	MOVEM R,IMASK		;REMEMBER, ALLOW PDL OV IN PDL OV HANDLER
	APRENB R,
]	;END IFE SAIL
IFN SAIL,[
	TLZ R,4			;TURN OFF <ESC>I INTERRUPTS
	MOVEM R,IMASK
	INTMSK R		;LEAVE ON ALL BUT ESC<I> AND CLOCK INTS
]	;END IFN SAIL
	HLRZ R,NOQUIT
	JUMPN R,GCPDLOV		;PDL OV IN GC - LOSE, LOSE, LOSE!!!
	MOVEI R,P		;NOW, AS GLS SAYS, "20 QUESTIONS"
	JUMPGE P,PDLH0
	MOVEI R,SP
	JUMPGE SP,PDLH0
	MOVEI R,FLP
	JUMPGE FLP,PDLH0
	MOVEI R,FXP
	JUMPGE FXP,PDLH0
	HLRZ R,NOQUIT
	SKIPN R
	 LERR [SIXBIT \RANDOM PDL OVERFLOW!\]
	JRST INTXT2

PDLH0:	HRRZ D,OC2-P(R)		;GET ORIGION OF OVERFLOW AREA
	CAIGE D,@(R)		;IF OVER THEN LOSE
	 JRST PDLLOS
	CAIG D,@(R)		;IF EQUAL THEN WE HAVE REALLY OVERFLOWED
	 JRST PDLOV1
;IF WE ARRIVE HERE THEN WHAT HAS HAPPENED IS THAT A ROUTINE IS FORCING A
;RECALCULATION OF THE LENGTH OF THE PDL AND THERE DOES NOT ACTUALLY
;EXIST A PDL OV.  THEREFORE, ALL WE HAVE TO DO IS TO CALCULATE THE
;NUMBER OF WORDS REMAINING IN THE PDL AND RETURN TO MAINLINE.
	HRRZ D,(R)		;GET PDL POINTER
	HRRZ F,C2-P(R)		;GET PDL ORIGION
	SUBI D,(F)		;COMPUTE NUMBER OF WORDS USED
	HLRZ F,C2-P(R)		;GET FULL SIZE OF PDL
	ADDI F,(D)		;COMPUTER CURRENT SIZE
	HRLM F,(R)		;STORE LENGTH IN PDL POINTER
	HRRZ F,INTPDL		;THEN JUST RETURN NORMALLY
	JRST INTXT2

;HERE IF WE HAVE A REAL PDL OV BUT STILL HAVE SOME EMERGENCY SPACE TO USE
PDLOV1:	MOVE F,OC2-P(R)		;GET OVERFLOW POINTER
	MOVEM F,(R)		;STORE IN APPROPRIATE PDL
	MOVSI D,QREGPDL-P(R)
	HRRI D,1005		;PDL-OVERFLOW
	HRRZ R,INTPDL
	HRRZ R,IPSPC(R)
	CAIL R,UINT0		;AVOID DEEP INTERRUPT RECURSION:
	 CAILE R,EUINT0		; IF PDL OVERFLOWED WITHIN UINT0,
	  JRST PDLH4		; THEN JUST STACK UP THE INTERRUPT,
	JSR UISTAK		; AND SOMEONE WILL EVENTUALLY TRY CHECKI
PDLRET:	HRRZ F,INTPDL
	JRST INTXT2

PDLH4:	MOVE R,FXP		;ELSE TRY TO GIVE A PDL OVERFLOW
	SKIPE GCFXP		; USER INTERRUPT IMMEDIATELY
	 MOVE FXP,GCFXP		;REMEMBER, PDL OVERFLOW IS NOT
	PUSH FXP,R		; DISABLED INSIDE THE PDL
	PUSHJ FXP,$IWAIT	; OVERFLOW HANDLER!!!
	 JRST XUINT
	JRST INTXIT

PDLLOS:	MOVE P,C2
	MOVE FXP,FXC2
	SETZM TTYOFF
	STRT UNRECOV
Q$	STRT @PDLMSG-P(R)
	JRST DIE

PDLMSG:	POVPDL		;REG
	POVFLP		;FLONUM
	POVFXP		;FIXNUM
	POVSPDL		;SPEC
]		;END OF IFN D10&QIO

SUBTTL	UNRECOVERABLE PDL OVERFLOW ACTION

PDLOV5:
Q%	PION
IFN QIO,[
IFN ITS,[
	.SUSET [.SPICLR,,XC-1]
	.SUSET [.SDF1,,R70]
	.SUSET [.SDF2,,R70]
]		;END OF IFN ITS
IFN D10+D20, PUSHJ P,REAINT	;RE-ENABLE INTERRUPTS
]		;END OF IFN QIO
	STRT UNRECOV
	STRT (B)
	SKIPN ERRTN	;BACK TO TOPLEVEL IF NOT ERRSET
	 JRST LSPRET
	JSP T,GOBRK	;BREAK UP THE ERRSET, AND SEE IF
	MOVEI A,NIL
	HRRZ TT,OFXC2	;ENOUGH PDL SPACE WAS RELEASED
	HRRZ D,OSC2	;THEREBY.  IF NOT, THEN DO MAJOR
	CAILE D,(SP)	;RESTART
	 CAIG TT,(FXP)
	  JRST PDLOV6
	HRRZ D,OC2
	HRRZ TT,OFLC2
	CAILE D,(P)
	 CAIG TT,(FLP)
	  JRST PDLOV6
	JRST (T)	;HERE IS ERRSET'S ERROR EXIT

PDLOV6:	SETZM TTYOFF
	MOVE P,C2
	PUSHJ P,ERRPNU		;UNDO SPECIAL BINDINGS, NO UNWIND-PROTECTS RUN
	STRT MESMAJ
	JRST LISPGO		;BIG RESTART

SUBTTL	ILLEGAL OPERATION AND MEMORY VIOLATION HANDLER

IFE QIO,[

;;; "UNRECOVERABLE" AND MACHINE TRAP ERRORS ARE PROCESSED HERE

ERRBAD:	MOVEI A,0	;"BAD" ERROR
	MOVE TT,UUOH
ERRBD1:	AOJA TT,ERRBD2

PARERR:	MOVEI A,5
	JRST PPGI4

ERRILO:	TDZA A,A
INTILM:	 MOVEI A,3
PPGI4:
IT$	MOVE TT,IPCLOK
10$	MOVE TT,.JBTPC"
;STANDARD ENTRY TO BAD ERROR HANDLER; ERROR TYPE IN A, PC IN TT
ERRBD2:	MOVEI R,-1(TT)	;INTERRUPTS LEAVE PC ADVANCED BY ONE
	MOVE B,ERRSW
	HRRZ TT,C2
	HRRZ T,SC2
	CAIGE TT,(P)
	 CAIG T,(P)
	  JSP TT,ERRBD3	;P HAS BEEN CLOBBERED; VERY BAD INDEED!
	HRLM SP,R
	PUSH P,R		;SP,,ADDR WHERE ERROR HAPPENED
	PUSH P,[$ERRFRAME]	;ERROR-FRAME-MARKER
	PUSH P,ERBMSG(A)	;0,,ADDRESS-OF-ERROR-MESSAGE
	SETZM NOQUIT
	JUMPE B,ERRBD4
	SETZM TTYOFF
	MOVEI T,-1(P)
	JSR ERROR4		.SEE EROR4A
ERRBD4:	HRRZ T,C2
	ADDI T,3
	CAIE T,(P)
	 JRST EROR1A
	SETZM TTYOFF
	STRT [SIXBIT \↑M;SYSTEM PDL CLOBBERED#!!\]
	STRT MESMAJ
	JRST LISPGO

ERRBD3:	MOVE P,C2
	MOVEI B,NIL
	JRST (TT)

ERBMSG:	[SIXBIT \ILGL MACHINE OPERATION!\]
	[SIXBIT \UNDEF FUNC CALLED!\]
IT$	[SIXBIT \JRST TO NIL (LOC 0)!\]
10$	[SIXBIT \QUACK!\]		;SHOULDN'T HAPPEN
	[SIXBIT \ILGL MEMORY REFERENCE!\]
	[SIXBIT \ATTEMPT TO WRITE ON PURE PAGE!\]
	[SIXBIT \PARITY ERROR!\]

IFN ITS,[
UUOGL1:	SETZ A,			.SEE UUOGLEEP
	HRRZ TT,UUOGLEEP	;GET ADDRESS OF BAD UUO
	CAIE TT,1
	 JRST ERRBD2		;RANDOM ILLEGAL OP
	HRRZ TT,JPCSAV		;OOPS, IT CAME FROM NIL!
	MOVEI A,2		;SUPER LOSER
	AOJA TT,ERRBD2
]		;END OF IFN ITS

]		;END OF IFE QIO

IFN QIO,[

ERRBAD:	MOVE T,UUTSV
	MOVEM D,ERRSVD
	SETZM JPCSAV		;TOO LATE TO GET JPC
	MOVE D,UUOH
IFN ITS,[
	JRST UUOGL2
UUOGL1:	MOVEM D,ERRSVD
	MOVE D,UUOGLEEP
];END IFN ITS
UUOGL2:
IT$	SUBI D,THIRTY+5		;SEE IF LOSING INSTRUCTION WAS AN ≠X
IT$	TRNN D,-1
IT$	 JRST $XLOST
IT$	ADDI D,THIRTY+5-1	;ELSE MOVE PC BACK TO LOSING INST
	SKIPN VMERR		;SKIP IF USER HANDLER
	 JRST UUOGL7
	PUSH FXP,ERRSVD		;YES, SET UP USER INTERRUPT
	PUSH FXP,D
	HRLI D,(D)
	HRRI D,UIMILO+100000	;ILLEGAL OPERATION
	PUSHJ P,UINT
	POP FXP,ERRSVD
	POP FXP,D
	JRST 2,@ERRSVD		;RESTORE MACHINE FLAGS

UUOGL7:	EXCH D,ERRSVD		;NO USER HANDLER
IT$	.CALL UUOGL8		;CRAP OUT TO DDT
10$	OUTSTR [ASCIZ\?ILLEGAL INSTRUCTION - BAD ERROR\]	
	 .VALUE

IFN ITS,[
UUOGL8:	SETZ
	SIXBIT \LOSE\		;TELL DDT WE'RE LOSING
	  1000,,1+.LZ %PIILO	;ILLEGAL OPERATION
	400000,,ERRSVD		;NEW PC

]		;END OF IFN ITS
]		;END OF IFN QIO

SUBTTL	MISCELLANEOUS ERROR ROUTINES

UUONVE:	PUSHJ P,NCONS
	MOVEI B,QNUMBERP
	PUSHJ P,XCONS
	FAC [NUMBER FUNCTION RETURNED NON-NUMERIC VALUE!]
	JRST UUONVL

SASERR:	EXCH A,B
	WTA [BAD ALIST - ASSOC!]
	EXCH A,B
	JRST SAS4

UUOMER:	HRRZ A,40
	LER3 [SIXBIT \ - MACRO NOT PERMITTED IN UUO CALL!\]
UUOFER:	HRRZ A,40
	LER3 [SIXBIT \ - WRONG NUMBER OF ARGS SUPPLIED BY UUO CALL!\]

IFN BIGNUM,[
REMAIR:	WTA [FLONUM ARG TO REMAINDER!]
	JRST -4(T)
]		;END OF IFN BIGNUM

UNOVER:
IFE NARITH,	TLNN T,100		.SEE %PCFXU	;FLOATING UNDERFLOW
IFN NARITH,	TLNN A,100		.SEE %PCFXU	;FLOATING UNDERFLOW
OVFLER:	LERR [SIXBIT \ARITHMETIC OVERFLOW!\]
UNFLER:	LERR [SIXBIT \ARITHMETIC UNDERFLOW!\]

ER2:	LERR MES3	;CONTEXT ERROR WITH DOT NOTATION -READ
ER3:	LERR [SIXBIT \BLAST? - READ!\]
ER4:	LERR [SIXBIT \GO OUT OF CATCH-BREAK DAMN#!!\]
RDNMER:	LERR [SIXBIT \NUMERIC OVERFLOW - READ!\]

ADEAD:	JFCL		;PUSHJ OR JRST THROUGH DEAD ARRAY PTR
	MOVEI A,ARQLS	;COULD ALSO GET HERE VIA ACALL/AJCALL
	FAC [ARRAY DEFINITION LOST!]


EG1:	UGT [NOT SEEN AS PROG TAG!]
	JRST GO2

INTNCO:	PUSH P,A		;INTERN CRAP-OUT
	MOVEI A,OBARRAY
	EXCH A,VOBARRAY
	UNLOCKI
	PUSHJ P,BADOB
	POP P,A
	JRST INTRN4
BADOB:	FAC [BAD VALUE FOR OBARRAY!]


DFPER:	POPI P,1
	POP P,A
	WTA [WRONG FORMAT - DEFPROP!]
	JRST DEFPROP

DEFNER:	POPI P,1
	POP P,A
	WTA [WRONG FORMAT - DEFUN!]
	JRST DEFUN

NCNCER:	WTA [NON-LIST - NCONC!]
	JRST .NCONC

APPERR:	WTA [NON-LIST - APPEND!]
	JRST .APPEND

PNGE:
PNGE1:	%WTA NASER
	JRST -2(T)

NASER:	SIXBIT \ATOMIC SYMBOL REQUIRED!\
SBADSP:	SIXBIT \ BAD SPACE TYPE - STATUS!\


;;; INCREDIBLE CROCK TO CONSTRUCT AN ERROR MESSAGE
;;; CONTAINING THE NAME OF THE APPROPRIATE CAR/CDR FUNCTION.

CA.DER:	PUSH FXP,[SIXBIT \ILLEGA\]
	PUSH FXP,[SIXBIT \L DATU\]
	PUSH FXP,[SIXBIT \M - CX\]
	PUSH FXP,[SIXBIT \R!!!! \]
CA.DE1:	TRNN T,776
	JRST CA.DE2
	ROT T,-1
	JRST CA.DE1
CA.DE2:	MOVEI D,-1(FXP)
	HRLI D,060600
CA.DE3:	ROT T,1
	MOVEI TT,'A
	TRNE T,1
	MOVEI TT,'D
	IDPB TT,D
	TRNN T,400000
	JRST CA.DE3
	MOVEI TT,'R
	IDPB TT,D
	%WTA -3(FXP)
	SUB FXP,R70+4
	JRST CR1A



NILSETQ:	PUSH P,A	;SOME NERD TRIED TO SETQ NIL, MAYBE?
	PUSH P,CPOPAJ
	CAIE T,VNIL
	JRST TSETQ		;NO, 'TWAS REALLY A TSETQ, MAYBE?
	MOVEI A,QNILSETQ
	%FAC NIHIL

TSETQ:	CAIE T,VT
	JRST XSETQ		;NO, I DON'T KNOW WHAT IT WAS!
	MOVEI A,QTSETQ
	%FAC VERITAS

XSETQ:	HRLM T,QXSET1		;HAND VALUE CELL (?) TO LOSER
	MOVEI A,QXSETQ
	%FAC PURITAS

STORE5:	HRRZ A,-1(P)
	%WTA [SIXBIT \DIDN'T EVAL TO GOOD ARRAY REFERENCE - STORE!\]
	MOVEM A,-1(P)
	JRST STORE7

RPLCA0:	WTA [BAD ARG - RPLACA!]
	JRST RPLACA
RPLCD0:	WTA [BAD ARG - RPLACD!]
	JRST RPLACD
RPLCA1:	WTA [PURE ARG - RPLACA!]
	JRST RPLACA
RPLCD1:	WTA [PURE ARG - RPLACD!]
	JRST RPLACD

%ARR0A:	WTA [WRONG TYPE ARRAY - ARRAYCALL!]
	JRST %ARR0B
%ARR0:	WTA [NOT ARRAY POINTER!]
%ARR0B:	MOVEM A,1(D)
	JRST %ARR7

LDGETQ:	FAC [CAN'T GET DDT SYMBOL - FASLOAD!]
LDXERR:	LERR [SIXBIT \BAD VALUE FOR "PURE" - FASLOAD!\]
10$ LDYERR:	LERR [SIXBIT \BAD VALUE FOR *PURE - FASLOAD!\]
LDALREADY:
Q%	LERR [SIXBIT \ALREADY FASLOADING!\]
Q$	FAC [INCORRECTLY NESTED FASLOAD!]

IFE BIGNUM*DBFLAG*CXFLAG,[
LDATE9:	QBIGNUM
	QDOUBLE
	QCOMPLEX
	QDUPLEX

LDATER:
HN%	SKIPA A,LDATE9-3(T)
HN$	MOVE A,LDATE9-3(T)
]		;END OF IFE BIGNUM*DBFLAG*CXFLAG
HN% FASHNE:	MOVEI A,QHUNK
IFE HNKLOG*BIGNUM*DBFLAG*CXFLAG, LER3 [SIXBIT \IN FASL FILE, BUT NOT IMPLEMENTED IN THIS LISP!\]

.SEE DBCONS
.SEE CXCONS
.SEE DXCONS
IFE DBFLAG*CXFLAG, NUM1MS: SIXBIT \CONS IN COMPILED CODE, BUT NOT IMPLEMENTED IN THIS LISP!\

IBSERR:	MOVEI A,IN10
	EXCH A,VIBASE
	PUSHJ P,NCONS
	MOVEI B,QIBASE
	PUSHJ P,XCONS
	PUSH P,[RD0B1]
	FAC [BAD VALUE FOR IBASE!]

BASER:	MOVEI A,IN10
	EXCH A,VBASE
	PUSHJ P,NCONS
	MOVEI B,QBASE
	PUSHJ P,XCONS
	PUSH P,[PRINI]
	FAC [BAD VALUE FOR BASE!]

IFE QIO,[
LINELR:	SAVE A B
	MOVE A,OLINEL
	EXCH A,VLINEL
	PUSHJ P,NCONS
	MOVEI B,QLINEL
	PUSHJ P,XCONS
	PUSHJ P,LINLR1
	RSTR B A
	JRST (D)

LINLR1:	FAC [BAD VALUE FOR LINEL!]
]			;END OF IFE QIO

IFN USELESS,[
%LVERR:	SETZ A,
	EXCH A,V%LEVEL
	PUSHJ P,NCONS
	MOVEI B,Q%LEVEL
	PUSHJ P,XCONS
	PUSH P,[%LVCHK]
	FAC [BAD VALUE FOR PRINLEVEL!]

%LNERR:	SETZ A,
	EXCH A,V%LENGTH
	PUSHJ P,NCONS
	MOVEI B,Q%LENGTH
	PUSHJ P,XCONS
	PUSH P,[%LNCHK]
	FAC [BAD VALUE FOR PRINLENGTH!]

]			;END OF IFN USELESS


SUBTTL	A PANDORA'S BOX OF ERROR MESSAGES
	
	NIHIL:	SIXBIT \NIHIL EX NIHIL - DON'T SETQ NIL!\
	VERITAS: SIXBIT \VERITAS AETERNA - DON'T SETQ T!\
	PURITAS: SIXBIT \PURITAS NECESSE EST - DON'T DO RANDOM BINDINGS!\
	POVPDL:	SIXBIT \REG PDL OVERFLOW!\
	POVFLP:	SIXBIT \FLONUM PDL OVERFLOW!\
	POVFXP:	SIXBIT \FIXNUM PDL OVERFLOW!\
	POVSPDL: SIXBIT \SPEC PDL OVERFLOW!\
	MESMAJ:	SIXBIT \↑M;MAJOR RESTART UNDERTAKEN↑M!\
	UNRECOV: SIXBIT \↑M;UNRECOVERABLE !\
	FLNMER:
	$ARERR:	SIXBIT \NON-FLONUM VALUE!\
	IARERR:
	FXNMER:	SIXBIT \NON-FIXNUM VALUE!\
DB$	DBNMER:	SIXBIT \NON-DOUBLE VALUE!\
CX$	CXNMER:	SIXBIT \NON-COMPLEX VALUE!\
DX$	DXNMER:	SIXBIT \NON-DUPLEX VALUE!\
	NMV3:	SIXBIT \NON-NUMERIC VALUE!\
IFN BIGNUM+CXFLAG,	NMV5:	SIXBIT \UNACCEPTABLE NUMERIC VALUE!\
	CAMMES:	SIXBIT \FIXNUM CANT COMPARE TO FLONUM.  IN  =, <, OR >!\
	MES2:	SIXBIT \ILLEGAL OBJECT SOMEWHERE OR OTHER - READ!\
	MES3:	SIXBIT \DOT CONTEXT ERROR!\
	MES5:	SIXBIT \UNDEFINED FUNCTION OBJECT!\
	MES6:	SIXBIT \UNBOUND VARIABLE!\
	MES14:	SIXBIT \NOT INSIDE LEXPR/LSUBR!\
	MES18:	SIXBIT \TOO MANY ARGUMENTS SUPPLIED - APPLY!\
	MES19:	SIXBIT \TOO FEW ARGUMENTS SUPPLIED - APPLY!\
	MES20:	SIXBIT \WRONG NUMBER OF ARGS TO LSUBR!\
	MES21:	SIXBIT \WRONG NUMBER OF ARGS TO FSUBR!\
	EMS1:	SIXBIT \EXTRA CHARS IN LIST - READLIST!\
	EMS3:	SIXBIT \NOT ENOUGH CHARS IN LIST - READLIST!\
	EMS5:	SIXBIT \READ-MACRO CONTEXT ERROR!\
	EMS6:	SIXBIT \BLAST, MISSING ")"!\
	EMS10:	SIXBIT \GOT TO TTY INSIDE S-EXP - READ!\
;	EMS11:	SIXBIT \HOW THE HELL CAN THIS BE?!\	.SEE HHCTB
	EMS12:	SIXBIT \TOO MANY INTERRUPTS - GO AWAY!\
	EMS13:	SIXBIT \LOST USER INTERRUPT!\
	EMS15:	SIXBIT \UNDEFINED FUNCTION IN UUO CALL!\
	EMS16:	SIXBIT \MORE THAN 5 ARGS!\
	EMS18:	SIXBIT \FUNCTION UNDEFINED AFTER AUTOLOAD!\
	EMS21:	SIXBIT \IMPROPER USE OF MACRO - EVAL!\
	EMS22:	SIXBIT \ILGL GO OR RETURN - NOT INSIDE A PROG!\
	EMS25:	SIXBIT \UNEVALUABLE DATUM - EVAL!\
	EMS26:	SIXBIT \FILE NOT FOUND!\
Q%	EMS27:	SIXBIT \NO OUTPUT UNIT SELECTED!\
Q%	EMS28:	SIXBIT \NO READ SOURCE SELECTED!\
	EMS29:	SIXBIT \NO CATCH FOR THIS TAG - THROW!\
	EMS31:	SIXBIT \INVALID ARG TO GENSYM!\
	EMS34:	SIXBIT \NOT SUBR POINTER!\
Q%	NONXDV:	SIXBIT \NON-EXISTENT DEVICE CHANNEL!\
Q%	SCRUDE:	SIXBIT \I/O SCREW!\
Q%	DEVFUL:	SIXBIT \ FULL - DELETE SOME FILE↑MAND TYPE $P TO RESUME↑M!\
Q%	OPNLUZ:	SIXBIT \↑M;I/O CHANNEL OPEN FAILURE!\
	STRTCR:	SIXBIT \↑M!\

SUBTTL	YET MORE MISCELLANEOUS ERROR ROUTINES
IFE QIO,[

IFE D10,[

;	PUTCODE [OPNER]\27+2*MOBIOF,INT,ERR

;;; SHARED ROUTINE FOR AN OPEN THAT LOSES.  TRIES TO BE HELPFUL.

OPNER:	LDB A,[270400,,-2(T)]	;GIVE OUT MESSAGE FOR ERROR UPON
	CAIE A,0		;ATTEMPTING TO OPEN I/O CHANNEL
	CAIL A,NOFCH
	.VALUE
	CAIN A,LPTC
	SETZM LPTON
IFN MOBIOF,[
	CAIN A,DISC
	SETZM DISPON
]		;END OF IFN MOBIOF
	CAIN A,UTOC
	SETZM TAPWRT
	SKIPN ERRSW
	JRST OPNR3
	SETZM TTYOFF
	.OPEN ERRC,OERRC	;THE ERRC IS ALWAYS RESERVED FOR THE SYSTEM IN NEWIO
	JRST OPNR3
OPNER1:	.IOT ERRC,A
	CAIN A,14
	JRST OPNER2
	PUSHJ P,TYO
	JRST OPNER1
OPNER2:	IFE QIO, SETZM ERRSW
OPNR3:	LERR OPNLUZ		;I/O CHANNEL OPEN FAILURE

OERRC:	SIXBIT \   ERR\
	1

;	ENDCODE [OPNER]

]		;END OF IFE D10

]		;END OF IFE QIO

IFE QIO,[

UTOER1:	SETZM TAPWRT
	SETZM UTOOPD
	MOVEI A,QUWL
	%FAC EMS27

URIOER:	SETZM TAPRED
	MOVEI A,QURL
	%FAC EMS28

IFE D10,[

IOERR:	.SUSET [.SIPIRQC,,A]
	MOVEM A,INTSV
	HRRZ A,INT+1
	LDB A,[270400,,-1(A)]
	CAIL A,NOFCH
	.VALUE 
	DPB A,[270400,,IOST]
	XCT IOST
	LDB A,[330400,,A]
	CAIN A,11
	JRST IODF
	CAIN A,4
	LERR NONXDV		;NON-EXISTENT DEVICE CHANNEL
	CAIE A,10
	JRST IOE3
	LDB A,[270400,,IOST]
IFN MOBIOF,[
	CAIE A,IMXC
	CAIN A,OMXC
	LERR [SIXBIT \MPX NOT OPENED!\]
]		;END OF IFN MOBIOF
	SKIPE INTSV
	.VALUE		;LOSING TWO INTERRUPTS AT SAME TIME
	PUSH P,INT+1
	PUSH P,A
	PUSH P,CPOPAJ
	.SUSET PINBL
	CAIN A,UTIC
	JRST URIOER
	CAIE A,UTOC
IOE3:	LERR SCRUDE	;I/O SCREW
]		;END OF IFE D10

]		;END OF IFE QIO

IFN MOBIOF,[

;	PUTCODE [MOBY I/O ERRORS]120,MIO,ERR,UIO

DERR1:	SIXBIT \DSLAVE FILE MISSING!\
DERR2:	SIXBIT \DISPLAY SLAVE HAS NOT BEEN OPENED!\
DERR3:	[SIXBIT \WRONG NUMBER OF ARGS TO SOME FUNCTION - DSLAVE!\]

DALMES:	WTA [FLONUM ARG REQUIRED - DISPLAY SLAVE!]
	JRST -1(T)

PPBSL4:	MOVE A,(P)
	WTA [BAD ARG TO SOME DISPLAY FUN!]
	JRST PPBSL1


DERR0:	LERR [SIXBIT \SLAVE HAS DIED!\]
DERR:	LERR [SIXBIT \TOO MANY DISPLAY ITEMS!\]		;TABLE OF ERRORS
	LERR [SIXBIT \DISPLAY MEMORY FULL!\]		;RETURNED FROM SLAVE
	LER3 [SIXBIT \ UNKNOWN DISPLAY ITEM!\]
	LERR [SIXBIT \ENORMOUS VECTOR!\]
	LERR [SIXBIT \BAD RELATIVE VECTOR - DSLAVE!\]
	LERR [SIXBIT \BAD FUNCTION - DSLAVE!\]
	LERR [SIXBIT \340 NOT AVAILABLE!\]
	LER3 [SIXBIT \ HAS TOO MANY DISPLAY INFERIORS!\]

;	ENDCODE [MOBY I/O ERRORS]

]		;END OF IFN MOBIOF


;	PUTCODE [ERRERC]15,ERR,SUS

ERRERC:	POP P,A		;LIKE (ERROR MSG ARGS)
	LER3 1,@(P)

ERRERO:	MOVEI A,(B)
	WTA [INVALID ERROR CHANNEL SPECIFICATION!]
	JRST ERRERB

ERERER:	MOVEI D,Q$ERROR
	SOJA T,S2WNAL

;	ENDCODE [ERRERC]




;	PUTCODE [EVAL.A]7,ERR,EVL,SUS

EVAL.A:	SUB P,[LERFRAME,,LERFRAME]	;CLEAR OUT ALL OF ERRFRAME
	PUSHJ P,SAVX5			;SAVE EVERYTING AND EVAL A
	PUSHJ FXP,SAV5M1		;ORDINARY FAIL-ACT ERROR.
	PUSHJ P,EVAL
EVAL.1:	PUSHJ FXP,RST5M1
	JRST RSTX5

;	ENDCODE [EVAL.A]


IFE D10\QIO,[
;	PUTCODE [IODF]15,ERR,UIO,INT

IODF:	PUSHJ P,SAVX5		;UNFORTUNATELY, INTERRUPTS REMAIN
	PUSHJ P,IOGBND		;SHUT OFF HERE. OTHER INTERRUPTS
	HRRZ A,UWRT		;MAY BE STACKED IN .IPIRQC
	DPB A,[062200,,IODF1]
	STRT IODF1
	STRT DEVFUL		;DEVICE FULL MESSAGE
	.VALUE [ASCII \:VK \]
	PUSHJ P,UNBIND
	PUSHJ P,RSTX5
	SOS INT+1
	JRST INTEX1

;	ENDCODE [IODF]

]		;END OF IFE D10\QIO

;	PUTCODE [.UDT]41,ERR,UIO

.UDT:	MOVEI B,(A)		;COME HERE ON UNDEFINED COMPILED COMPUTED PROG TAG
	PUSHJ P,FIXP
	EXCH A,B
	JUMPN B,.UDT2
	SKIPN ERRSW
	 JRST .UDT1
	PUSHJ FXP,SAV5
	STRT 17,[SIXBIT \↑M;IN !\]
	HRRZ B,-NACS(P)		;GET RETURN ADDRESS
	PUSHJ P,ERRADR		;AND PRINT OUT FUN THEREFOR
	JSP R,RSTR5
.UDT1:	UGT [ UNDEFINED COMPUTED GO TAG!]
	POPJ P,

.UDT2:	SETZM PNBUF
	SETZM PNBUF+1
	SETZM PNBUF+2
	MOVEI C,10.
	MOVEI R,.UDT4
	MOVE AR1,[440700,,PNBUF]
	JUMPGE TT,.+3
	MOVNS TT
	%NEG%
	PUSHJ P,PRINI9
	SETOM LPNF
	MOVEI C,(AR1)
	JRST RINTERN

;	ENDCODE [.UDT]

ESB6:	MOVEI D,0
WNAERR:	CAMG TT,T
	 SKIPA TT,[MES19]	;TOO FEW ARGS
	  MOVEI TT,MES18	;TOO MANY ARGS
	MOVEM B,QF1SB
	PUSH FXP,TT
	JUMPN D,WNAER1		; D ↑= 0 => LISTING ALREADY DONE
	PUSH FXP,R
	PUSHJ FXP,LISTX
	POP FXP,R
WNAER1:	HLRZ B,(P)
	PUSHJ P,XCONS
	MOVEM A,(P)
	PUSHJ P,ARGSCU
	POP FXP,TT
	JRST QF1A


QF3A:	SKIPA TT,[MES19]	;AT THIS POINT, WE CRAP OUT
QF2A:	 MOVEI TT,MES18
	MOVE T,R
	PUSHJ FXP,LISTX
	HLRZ B,(P)
	JUMPN B,.+2
	MOVEI B,QM		;QUESTION MARK!
	PUSHJ P,XCONS
	EXCH A,(P)
	JSP T,%CADR
QF1A:	PUSHJ P,NCONS
	POP P,B
	PUSHJ P,XCONS
	%WNA (TT)
	JRST EVAL


UUOH3C:	SAVE A B
	MOVEI T,EMS18
	JRST UUOUE1

UUOH3A:	SAVE A B
UUOUER:	MOVEI T,EMS15
UUOUE1:	MOVNI A,LUUSV		;UNDEFINED UUO CALL
	PUSH FXP,UUOH+LUUSV(A)
	AOJL A,.-1
	PUSH FXP,40
	HRRZ A,40
	%UDF (T)	;UNDEF FUN IN UUO CALL (OR AFTER AUTOLOAD)
	POP FXP,40
	MOVEI T,LUUSV
	POP FXP,UUOH-1(T)
	SOJG T,.-1
	HRRZ T,A
	JUMPN A,UUOUE2
	HRRZ A,40
	PUSHJ P,EPRINT
Q%	MOVEI A,1
Q%	JRST ERRBD1
Q$	LERR [SIXBIT \UNDEFINED FUNCTION CALLED!\]
UUOUE2:	POP P,B
	POP P,A
	CAIE T,QUNBOUND
	 JRST UUOH0A
	JRST UUOH3A

EPRINT:	SKIPN ERRSW		;ERROR PRINTOUT
	 POPJ P,
	JRST EPRNT1

EV3B:	SKIPA A,EV0B
EV3A:	 HLRZ A,AR1
	%UDF MES5		;UNDEFINED FUNCTION OBJECT
	JRST EV4B

EV3J:	HLRZ A,AR1
	%UDF EMS18		;FN UNDEF AFTER AUTOLOAD
	JRST EV4B

IAP2A:	TDZA TT,TT		;UNDEFINED FN OBJECT
IAP2J:	 MOVEI TT,EMS18-MES5	;FN UNDEF AFTER AUTOLOAD
	HLRZ A,(C)
	SKIPN A
	 HRRZ A,(C)
	%UDF MES5(TT)
	HRRM A,(C)
	JRST ILP1

WNAL0:	MOVE D,(TT)
	TLNE D,1		;SKIP IF LSUBR
	 JRST WNAFOSE
WNALOSE:
	PUSHJ FXP,LISTX		;LISTIFY UP LSUBR ARGS
	MOVEI TT,MES20		;USE LSUBR MESSAGE
WNAL1:	MOVEI B,(D)
	PUSHJ P,XCONS		;CONS FUNCTION NAME ONTO ARG LIST
	PUSH P,A
	MOVEI A,QM		;USE ? FOR ARGS SPEC
	JRST QF1A

STERR:	MOVEI D,(F)
WNAFOSE:	MOVEI TT,MES21	;USE FSUBR MESSAGE
	JRST WNAL1


IFE QIO,[
LDOERR:	UNLOCKI
	PUSHJ P,LDFNSET
	PUSHJ P,UNBIND
	PUSH P,[QFASLOAD]
	JRST UFLR1
]		;END OF IFE QIO

IFN D10,[
FASLUR:	RELEASE TMPC,
FASLUH:	UNLOCKI
	LERR [SIXBIT \CAN'T DEPURIFY HIGH SEGMENT!\]
]		;END OF IFN D10

FASLNX:
10$	SETZM LDXSIZ
10%	SETZM LDXLPC
FASLNC:
IT$ Q%	.CLOSE DSIC,
Q$	HRRZ A,LDBSAR
Q$	PUSHJ P,$CLOSE
10$ Q%	RELEASE DSIC,		;NICE LONG ERR MSG TO REASSURE MACSYMA LOSERS
	LERR [SIXBIT \YOU HAVE RUN OUT OF CORE - FASLOAD!\]	;TOTAL LOSS

LDFERR:
IT$ Q%	.CLOSE DSIC,
Q$	HRRZ A,LDBSAR
Q$	PUSHJ P,$CLOSE
10$ Q%	RELEASE DSIC,
	UNLOCKI
	MOVE A,LDFNAM
	MOVEI B,QFASLOAD
	PUSHJ P,XCONS
	PUSHJ P,UNBIND
	SUB P,R70-LDPRLS+1
	FAC [FILE NOT IN FASLOAD FORMAT!]



IFE QIO,[
UNTAER:	HRRZ A,(P)
	WTA [NEED 2 FILE NAMES IN LIST!]
	HRRM A,(P)
	JRST (T)

UROER:	SETZM UTIOPD
	SETZM TAPRED
	MOVEI B,QUREAD
	JRST UFLER

UAPPER:	SKIPA B,[QUAPPEND]
UKLER:	MOVEI B,QUKILL
UFLER:	UNLOCKI
	PUSH P,B
	PUSHJ P,SCRFUN
UFLR1:	POP P,B
	POP P,IUNIT
	PUSHJ P,XCONS
	%FAC EMS26

UREDER:	PUSH P,A
	MOVEI A,QURL
	SETZM TAPRED
	PUSHJ P,[%FAC EMS28]
	POP P,A
	SKIPN UTIOPD
	POPJ P,
	AOS TAPRED
	JRST URED
]		;END OF IFE QIO

LMBERR:	EXCH A,C
	MOVE R,T
	WTA [BAD LAMBDA LIST!]
	MOVE TT,C
	JRST IPLMB1

LXPRLZ:	LERR [SIXBIT \TOO MANY ARGS TO LEXPR!\]

DOERRE:	MOVEI A,(B)
	WTA [ BAD END TEST FORM - DO!]
	MOVEI B,(A)
	JRST DO4C

GETLE:	EXCH A,B
GETLE1:	WTA [BAD LIST - GETL!]
	EXCH A,B
	JRST GETL



SETWNA:	POP P,A
	MOVEI B,QSETQ
	PUSHJ P,XCONS
	PUSHJ P,NCONS
	WNA [ODD NUMBER OF ARGS - SETQ!]
	JRST EVAL

SIGNPE:	MOVE A,(P)
	WTA [UNRECOGNIZABLE TEST REQUEST - SIGNP!]
	MOVEM A,(P)
	JRST SIGNP0

PROPER:	WTA [BAD ARG - PUTPROP!]
	JRST PUTPROP
RMPER0:	WTA [BAD ARG - REMPROP!]
	JRST REMPROP


LFYER:	PUSHJ P,NCONS		;NOT INSIDE LSUBR
	MOVEI B,QLISTIFY
	PUSHJ P,XCONS		;LET LOSER FIGURE IT OUT
	%FAC MES14

GENSY8:	%WTA EMS31
	PUSH P,A
	JRST GENSY7

ARGCM8:	WTA [ARG TOO LARGE OR <1 - ARG/SETARG!]
	JRST ARGCOM
ARGCM0:	MOVEI R,-1(R)	;NOTE: FLUSHES FLAGS IN LEFT HALF!
	CAIN R,ARGXX
	JRST ARGCM1
	CALLF 2,QLIST
	MOVEI B,QSETARG
	JRST ARGCM2
ARGCM1:	PUSHJ P,NCONS
	MOVEI B,QARG
ARGCM2:	PUSHJ P,ACONS	;LISTIFY AGAIN, WITHOUT LOSING B
	PUSHJ P,XCONS
	%FAC MES14

PTRCKE:	PUSH P,A
	MOVEI A,(TT)
	%WTA EMS34
	MOVEI TT,(A)
	POP P,A
	JRST PTRCHK

.STOLZ:	PUSH P,B
	PUSHJ P,NCONS
	MOVEI B,QM
	PUSHJ P,XCONS
	MOVEI B,QSTORE
	PUSHJ P,XCONS
	POP P,B
	PUSH P,T
	FAC [CAN'T STORE INTO NON-ARRAY!]

IFN QIO,[
TYOAGE:	WTA [NOT ASCII VALUE!]
	JRST TYOARG

GTRDT9:	FAC [BAD VALUE FOR READTABLE!]

EOFE:	MOVEI A,(AR1)
	PUSHJ P,NCONS
	MOVEI B,QRDEOF
	PUSHJ P,XCONS
	PUSHJ P,EOFE1
	JUMPE A,EOF5
	SKIPE T,EOFRTN		;CLOBBER IN EOF VALUE IF NON-NIL
	 HRRM A,-LERSTP-1(T)	; AND IF EOF FRAME EXISTS
	JRST EOF5

EOFE1:	FAC [END OF FILE WITHIN READ!]
]		;END OF IFN QIO

MAPWNA:	MOVEI D,QMAPLIST-MAPLIST-1(TT)
	SOJA T,WNALOSE

DLT6:	CAIE D,MEMBER
	SKIPA D,[QDELQ]
	MOVEI D,QDELETE
	JRST WNALOSE

$CONS9:	MOVEI D,Q$CONS		;ZERO ARGS => ERROR
	SOJA D,WNALOSE

SUSPE:	PUSHJ P,NCONS
	MOVEI B,QSUSPEND
	PUSHJ P,XCONS
	MOVE TT,FXP		;TO ALLOW RETURNS FROM THE FAC, FXP
	SUB TT,R70+1		; MUST BE RESTORED
	SKIPE (FXP)
	 MOVE TT,(FXP)		;IF TOP OF FXP NON-ZERO THEN IS POINTER
	MOVE FXP,TT		; TO OLD FXP; RESTORE CORRECT FXP
	FAC [I/O IN PROGRESS - CAN'T SUSPEND!]

GTPDL1:	WTA [ NOT PDL POINTER!]
	JRST GTPDLP

RAND9:	MOVEI D,QRANDOM
S2WNAL:	SOJA T,S1WNAL

TYPKER:	MOVEI D,QTYIPEEK
S1WNAL:	SOJA T,WNALOSE

GRCTIE:	EXCH A,B
	WTA [NOT VALID READTABLE INDEX!]
	EXCH A,B
	JRST GRCTI

FRERR:	WTA [NOT A FRAME POINTER - FRETURN!]
	JRST FRETURN

IFN USELESS*ITS,[
CRSRP2:	WTA [BAD CURSOR CODE - CURSORPOS!]
	JRST CRSRP3
]		;END OF IFN USELESS*ITS

IFN FUNAFL,[
ALST0:	MOVE A,-1(P)
	WTA [BAD ALIST - EVAL/APPLY!]
	MOVEM A,-1(P)
	JRST ALIST
]		;END OF IFN FUNAFL

LFY0:	WTA [ARG TOO LARGE - LISTIFY!]
	JRST LISTIFY

IFN ITS+SAIL,[
ALCK0:	EXCH A,B
	WTA [BAD ARG - ALARMCLOCK!]
	JRST ALARMCLOCK
]		;END OF IFN ITS+SAIL

PRGER1:	EXCH A,AR2A
	WTA [BAD VAR LIST - PROG!]
	EXCH A,AR2A
	JRST PRG1

DOERR:	POP P,A
	WTA [BAD VAR LIST - DO!]
	MOVEM A,-2(P)
	JRST DO5

DO5ER:	MOVEI A,(B)
	WTA [EXTRANEOUS STEPPER - DO!]
	JRST DO5Q


ATAN.7:	LERR [SIXBIT \OVERFLOW/UNDERFLOW IN ATAN!\]
EXP.ER:	MOVE D,[EXPER1,,[SIXBIT \ARG TOO BIG - EXP!\]]
	JRST NUMER
EXPER1:	EXCH A,B
	JRST EXP.
SIN.ER:	SKIPA D,[SIN.,,[SIXBIT \ARG TOO BIG FOR ACCURACY - SIN!\]]
COS.ER:	MOVE D,[COS.,,[SIXBIT \ARG TOO BIG FOR ACCURACY - COS!\]]
	JRST NUMER
SQR$ER:	SKIPA D,[SQRT.,,[SIXBIT \NEG ARG - SQRT!\]]
LOG.ER:	MOVE D,[LOG.,,[SIXBIT \NON-POS ARG - LOG!\]]
NUMER:	JSP T,PDLNMK		;IF ARG WAS A PDL NUM, GET A REAL ONE
	%WTA (D)		;COMPLAIN TO LOSER
	HLRZS D
	JRST 2,@D

	IARERR
	$ARERR
ARTHER:	%WTA @.-1(T)
	JRST ARITH

1EQNF:	TDZA T,T
1GPNF:	MOVEI T,$GREAT-$EQUAL
	EXCH A,B
	%WTA CAMMES
	JRST $EQUAL(T)
2EQNF:	TDZA T,T
2GPNF:	MOVEI T,$GREAT-$EQUAL
	%WTA CAMMES
	EXCH A,B
	JRST $EQUAL(T)


IFE QIO,[
ER1:	MOVEI A,QM
	SKIPN TAPRED
	JRST ER1A
	HRRZ T,UTIBP
	SUBI T,4
	CAIGE T,UTIB
	MOVEI T,UTIB
	MOVEI TT,LPNBUF-1(T)
	CAILE TT,UTIB+UTBSIZ-1
	MOVEI TT,UTIB+UTBSIZ-1
	SUBI TT,(T)
	HRLI T,PNBUF
	BLT T,PNBUF(TT)
	SETOM LPNF
	PUSHJ P,RINTERN
ER1A:	LER3 MES2
]		;END OF IFE QIO


GCMLOSE:	HRRZ C,GCMES+NFF(F)
	JSR GCRSR
	SETOM PANICP
	%GCL GCLSMS
	SETZM PANICP
	POP P,A
	SETOM IRMVF	;ON GENERAL PRINCIPLES, GCTWA ONCE
	JRST AGC

GCMES:	QLIST
	QFIXNUM
	QFLONUM
DB$	QDOUBLE
CX$	QCOMPLEX
DX$	QDUPLEX
BG$	QBIGNUM
	QSYMBOL
REPEAT HNKLOG, CONC QHUNK,\.RPCNT+1
	QARRAY
	QSYMBOL		;FOR SYMBOL-BLOCKS, SIMPLY SAY "SYMBOL"
IFN .-GCMES-NTYPES-1+1, WARN [WRONG LENGTH TABLE]

GCLSMS:	SIXBIT \STORAGE CAPACITY EXCEEDED!\


;;; COME HERE WHEN THINGS LOOK REALLY DESPERATE IN GC.

GCLUZ:	SKIPN PANICP		;HOPE FOR THE BEST, JPG!
	 SKIPE INHIBIT		;GC-LOSSAGE CAN'T WIN IF INHIBITED
	  CAIA
	   JRST GCMLOSE
	SKIPE C,F
	 HRRZ C,GCMES+NFF(F)	;WELL, IT LOOKS LIKE WE
	JSR GCRSR		; HAVEN'T EVEN A SNOBOL'S
	SETZM TTYOFF		; CHANCE IN HELL HERE...
	JUMPE A,GCLUZ6
	PUSHJ P,PRINT		;TELL LOSER HE LOST TOTALLY
GCLUZ3:	STRT 17,GCLSMS
	STRT 17,[SIXBIT \ BEYOND RECUPERATION!\]
	SKIPLE IRMVF
	 JRST GCLUZ7
GCLUZ5:	MOVEI TT,SPDLORG
	CAILE TT,(SP)		;IF WE LOST OUT GC'ING AT TOP
	 JRST DIE		; LEVEL, WE ARE TOTALLY LOST
GCLUZ4:	STRT 17,MESMAJ		;OTHERWISE WE HAVE HALF A CHANCE
	PUSHJ P,ERRPNU		; OF FREEING UP SOME STORAGE (NO UNWIND-PRO'S)
	JRST LISPGO		; BY UNBINDING SPECIAL VARIABLES

GCLUZ6:	STRT 17,[SIXBIT \SYMBOL BLOCK!\]
	JRST GCLUZ3

GCLUZ7:	SETOM IRMVF
	JRST GCLUZ4


GCPDLOV:	SETZM TTYOFF
	MOVE P,C2
	MOVE FXP,FXC2
	STRT 17,[SIXBIT \↑M;PDL OVERFLOW WHILE IN GC#!!\]
	JRST GCLUZ5


;;; COME HERE WHEN EVERY HOPE FOR RECOVERY HAS BEEN EXHAUSTED.

DIE:	STRT 17,[SIXBIT \↑M;YOU HAVE LOST BADLY#!↑M!\]
	.VALUE
	JRST DIE

SUBTTL	ERROR ADDRESS DECODER

IFN QIO,[
ERRADR:	HRRZ AR1,VMSGFILES
	TLO AR1,200000
ERRAD1:	PUSH P,AR1
	PUSHJ P,ERRDCD
	POP P,AR1
	JRST $PRIN1
]		;END OF IFN QIO


Q% ERRADR:	 PUSH P,CPRIN1
ERRDCD:	MOVEI A,QM		;DECODE ADDRESS AS SUBR OR ARRAY
10$	CAIL B,ENDFUN		; PROPERTY OF SOME ATOM
10%	CAIGE B,BEGFUN		;ADDRESS 0 ALWAYS GIVES OUT QM - SEE BK1A1B
CPRIN1:	 POPJ P,PRIN1		;ERRDCD SAVES T (SEE WNAYOSE)
10$	CAIL B,BEGFUN
10%	CAIGE B,ENDFUN
	 JRST ERRO2E
	CAIL B,BBPSSG
	 CAMLE B,BPSH
	  POPJ P,
ERRO2E:	
10$ 	MOVEI AR2A,BBPSSG
10%	MOVEI AR2A,BEGFUN
	LOCKI			;GCGEN IS NOT INTERRUPT SAFE
	JSP R,GCGEN
		ERRO2Q
	UNLKPOPJ

ERRO2Q:	SKIPE INTFLG	;LET INTERRUPTS HAPPEN - THIS IS A VERY
	JRST ERRO2R	; LONG PROCESS FOR LARGE OBARRAYS!
ERRO2A:	HLRZ TT,(D)
ERRO2C:	HRRZ TT,(TT)
	JUMPE TT,ERRO2B
	HLRZ AR1,(TT)
	HRRZ TT,(TT)
	CAIN AR1,QLSUBR
	 JRST ERRO2H
	CAIE AR1,QSUBR
	 CAIN AR1,QFSUBR
	  JRST ERRO2H
	CAIE AR1,QARRAY
	 JRST ERRO2C
	HLRZ AR1,(TT)
	HRRZ TT,(AR1)
	CAML B,@VBPEND		;IF ARG IS < BPEND, THEN CANT BE AN ARRAY
	 CAIGE TT,-3(B)
	  JRST ERRO2B
	JRST ERRO2G

ERRO2H:	HLRZ TT,(TT)
10$	CAIL B,HILOC	;IF ARG IS IN HIGH SEGMENT,
10$	 JRST ERRO2G	; MUST BE SUBR
	CAML B,@VBPORG
	 JRST ERRO2B	;IF ARG > BPORG, THEN CANT BE A SUBR [MUST BE ARRAY]
ERRO2G:	CAMLE TT,AR2A
	 CAMLE TT,B
	  JRST ERRO2B
	MOVE AR2A,TT
	HLRZ A,(D)
ERRO2B:	HRRZ D,(D)
	JUMPN D,ERRO2A
	JRST GCP8A

ERRO2R:	HRRZ AR1,VOBARRAY
	MOVEI TT,(F)
	SUB TT,TTSAR(AR1)
	UNLOCKI			;GIVE A POOR INTERRUPT
	LOCKI			; A CHANCE IN LIFE
	ADD TT,TTSAR(AR1)
	HRRI F,(TT)
	JRST ERRO2A

SUBTTL	ERROR, ERRFRAME, ERRPRINT

BEGFUN==.

$ERROR:	JUMPE T,EROR1A		;(ERROR) SIMPLY ACTS LIKE (ERR)
	AOJE T,[LERR 1,@(P)]	;(ERROR MSG)
	AOJE T,ERRERC
	AOJN T,ERERER
	POP P,A
ERRERB:	MOVEI B,(A)
	CAIL A,QUDF
	 CAIL A,QUDF+NERINT
	  JRST ERRERN
10$	MOVEI D,(A)
10$	SUBI D,QUDF
.ELSE 	HRREI D,-QUDF(A)
	JRST ERRERD

ERRERN:	PUSHJ P,FIXP
	JUMPE A,ERRERO
	MOVEI D,-5(TT)
	JUMPL D,ERRERO
ERRERD:	CAIL D,NERINT		;# USER INTERRUPT ERRORS - RANGE FROM 0 TO NERINT-1
	 JRST ERRERO
	MOVEI A,POP1J		;(ERROR MSG ARGS CHNO)
	EXCH A,(P)
	IORI D,<(SERINT)>←-5
	DPB D,[2715←30 -1(P)]
	XCT -1(P)		;THIS WINS FOR FAIL-ACT, FOR IT WILL
	POPJ P,			; POPJ BY ISELF WITHOUT COMING HERE;
				; DITTO FOR IO-LOSSAGE.


SUBR:	HRRZ B,(A)		;SUBR 1
	JRST ERRDCD

;;; ERRFRAME TAKES PDL POINTER, AND RETURNS AN ERROR FRAME.
;;; FORM OF RETURNED VALUE:
;;;	(ERR <REGPDL PTR> <ERROR MSG> <SPECPDL PTR>)
;;; WHERE <ERROR MSG> TAKES ONE OF THREE FORMS:
;;;	(<MESSAGE>)
;;;	(<MESSAGE> <LOSING S-EXP>)
;;;	(<MESSAGE> <LOSING S-EXP> <TYPE>)
;;; I.E. IT IS A LIST OF ARGS SUITABLE FOR THE ERROR FUNCTION.

ERRFRAME:	JSP R,GTPDLP	;SUBR 1
		      $ERRFRAME		;MUST APPEAR TWICE
		      $ERRFRAME
	 JRST FALSE
	POPI D,1
	PUSH FXP,D
	PUSHJ FXP,SAV5M1
	MOVE D,2(D)	;D SHOULD POINT TO JUST BELOW THE FRAME MARKER
	PUSH P,R70
	LSHC D,-33
	LSH R,-40
	CAIGE D,ERINT←-33
	 JRST EPR6
	MOVEI A,QUDF(R)
	PUSHJ P,ACONS
	MOVEM A,(P)
EPR6:	HRRZ A,(FXP)
	HRRZ A,3(A)
	HRRZ B,(P)
	PUSHJ P,CONS
	MOVEM A,(P)
	HRRZ A,(FXP)
	HRRZ A,2(A)
	CAIN D,ERINT←-33
	 JRST EPR7
	CAIE D,SERINT←-33
	 SKIPE R
	  JRST EPR5
EPR7:	HRLI A,440600		;IF MSG IS SIXBIT, MUST CREATE
	MOVEM A,CORBP		; AN ATOMIC SYMBOL WHOSE PRINT NAME
	MOVEI T,EPR1		; IS THE MESSAGE
	PUSHJ FXP,MKNR6C
	PUSHJ P,RINTERN
EPR5:	POP P,B
	PUSHJ P,CONS
	PUSH P,CR5M1PJ
	PUSH P,A
	POP FXP,D
	JRST FRM4

EPR1:	ILDB BYTEAC,CORBP
	CAIN BYTEAC,'!	;! IS END OF MESSAGE
Q%	 JRST FALSE
Q$	 POPJ P,
	CAIN BYTEAC,'↑	;↑ CONTROLIFIES NEXT CHARACTER
	 JRST EPR3
	CAIN BYTEAC,'#	;# QUOTES NEXT CHAR
	 ILDB BYTEAC,CORBP
EPR4:	ADDI BYTEAC,40
Q%	POPJ P,
Q$	JRST POPJ1

EPR3:	ILDB BYTEAC,CORBP	;THIS "CONTROLIFICATION" ALGORITHM
	ADDI BYTEAC,40	; CONVERTS ↑M TO CTRL/M, BUT ALSO ↑4 TO
	TRC BYTEAC,100	; LOWER CASE T, ETC.; HENCE CAN REPRESENT
	POPJ P,		; ALL OF ASCII USING ↑ AS AN ESCAPE

IFE QIO,[
ERRPRINT:			;SUBR 1
	JSP R,GTPDLP	;PRINT OUT ERROR MESSAGE STACKED ON  
	   $ERRFRAME	;PDL JUST PRIOR TO POINT SPECIFIED BY ARG
	   $ERRFRAME	;EXTRA COPY OF $ERRFRAME
	 JRST FALSE
	HLRZ TT,1(D)
	JUMPE TT,ERRPT4
	PUSH P,1(D)
	MOVE A,2(D)
	PUSH P,A
	JSR ERROR3
ERRPT3:	MOVEI A,TRUTH
	JRST POP2J

ERRPT4:	MOVE T,D
	JSR ERROR4
	JRST TRUE
]		;END OF IFE QIO

IFN QIO,[
ERRPRINT:			;LSUBR (1 . 2)
	JSP F,PRNARG
	   [QERRPRINT]
	PUSHJ P,OFCAN
	JSP R,GTPDLP	;PRINT OUT ERROR MESSAGE STACKED ON  
	   $ERRFRAME	; PDL JUST PRIOR TO POINT SPECIFIED BY ARG
	   $ERRFRAME	;EXTRA COPY OF $ERRFRAME
	 JRST FALSE
	PUSHJ P,ERROR3
	JRST TRUE


;OUTPUT FILE CANONICALIZER.  MAKES CONTENTS OF AR1
; INTO AN ORDINARY LIST SUITABLE FOR FEEDING TO STRT.

OFCAN:	PUSH P,A		;SAVES T
	MOVEI A,(AR1)
	SKIPGE AR1
	 PUSHJ P,ACONS
	HRRZ B,V%TYO
	TLNN AR1,200000
	 PUSHJ P,XCONS
	MOVEI AR1,(A)
	JRST POPAJ

]		;END OF IFN QIO
β